package nz;

import javax.swing.*;
import java.awt.*;
import java.util.Map;
import java.util.Iterator;

public class BarChartPanel extends JPanel {
    private final Map<String, Integer> data;
    private final String title;
    private final Color[] colors = {
            Color.RED, Color.BLUE, Color.GREEN, Color.ORANGE, Color.CYAN, Color.MAGENTA,
            Color.PINK, Color.YELLOW
    };
    private Iterator<Color> colorIterator;

    public BarChartPanel(Map<String, Integer> data, String title) {
        this.data = data;
        this.title = title;
        this.colorIterator = java.util.Arrays.stream(colors).iterator();
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;

        // 设置图表标题
        g2d.setFont(new Font("SansSerif", Font.BOLD, 16));
        g2d.drawString(title, getWidth() / 2 - g2d.getFontMetrics().stringWidth(title) / 2, 20);

        if (data.isEmpty()) return;

        // 定义柱状图区域的尺寸（缩小宽度和高度）
        int padding = 40; // 图表边距
        int chartWidth = getWidth() / 2;  // 缩小宽度为面板宽度的一半
        int chartHeight = getHeight() / 3; // 缩小高度为面板高度的三分之一
        int chartX = (getWidth() - chartWidth) / 2; // 居中X轴
        int chartY = (getHeight() - chartHeight) / 2; // 居中Y轴

        // 绘制坐标轴
        g2d.drawLine(chartX, chartY + chartHeight, chartX + chartWidth, chartY + chartHeight); // X轴
        g2d.drawLine(chartX, chartY, chartX, chartY + chartHeight); // Y轴

        // 获取数据的最大值
        int maxValue = data.values().stream().mapToInt(Integer::intValue).max().orElse(1);

        // 调整柱子的宽度及间隔
        int barWidth = (chartWidth - padding) / (data.size() * 2); // 减小柱子宽度，使柱子之间间隔更大
        int gap = barWidth; // 增加柱子间的间距

        int x = chartX + gap; // 起始X坐标（加上间距）

        for (Map.Entry<String, Integer> entry : data.entrySet()) {
            int barHeight = (int) ((double) entry.getValue() / maxValue * (chartHeight - padding)); // 缩小柱子高度

            // 获取下一个颜色并绘制柱子
            g2d.setColor(getNextColor());
            g2d.fillRect(x, chartY + chartHeight - barHeight, barWidth, barHeight);

            // 绘制类别标签（X轴下方）
            g2d.setColor(Color.BLACK);
            String category = entry.getKey();
            int labelWidth = g2d.getFontMetrics().stringWidth(category);

            // 如果标签宽度过大，调整位置，使其居中
            g2d.drawString(category, x + barWidth / 2 - labelWidth / 2, chartY + chartHeight + 15);

            // 绘制数值标签（柱子顶部）
            String value = String.valueOf(entry.getValue());
            int valueWidth = g2d.getFontMetrics().stringWidth(value);
            g2d.drawString(value, x + barWidth / 2 - valueWidth / 2, chartY + chartHeight - barHeight - 5);

            x += barWidth + gap; // 移动到下一个柱子的位置
        }
    }

    // 从颜色数组中循环获取下一个颜色
    private Color getNextColor() {
        if (!colorIterator.hasNext()) {
            colorIterator = java.util.Arrays.stream(colors).iterator(); // 如果颜色用尽，重新开始
        }
        return colorIterator.next();
    }
}
